/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ihale.database;
/**
 *
 * @author Mehmet Sinan
 */

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.ihale.Ihale;
import org.ihale.tedarikci.Tedarikci;
import org.ihale.satinalmaci.SatinAlmaci;
import org.teklif.Teklif;

public class DatabaseMehmet {
    
    private Connection connection = null;
    private final String driver = "com.mysql.jdbc.Driver";
    private final String connectionString = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8";
    private final String user = "root";
    private final String password = "1234";

    public void connect() throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        connection = (Connection) DriverManager.getConnection(connectionString, user, password);
        System.out.println("Jdbc Mysql Connection String :");
        System.out.println(connection);


    }

    /**
     * Disconnection method for disconnecting the database
     * @throws SQLException Disconnect sql exception
     */
    public void disconnect() throws SQLException {
        if ((this.connection != null)) {
            if (!this.connection.isClosed()) {
                this.connection.close();
            }
        }
    }

   
    
    public List<Tedarikci> getTedarikciListesi(int id)  throws SQLException {
    
       
     List<Tedarikci> TedarikciListesi = new ArrayList<Tedarikci>();
     
     try {
          String query = "select * from ted_ih, tedarikci where tedarikci.idtedarikci=ted_ih.ted_id and ih_id=?";
     PreparedStatement statement = connection.prepareStatement(query);
            statement.setInt(1, id);
            ResultSet result = statement.executeQuery();
        while (result.next()) {
            Tedarikci tedarikci = new Tedarikci();
            tedarikci.setId(result.getInt("idtedarikci"));
            tedarikci.setSirketAdi(result.getString("sirket_adi"));
            tedarikci.setAdres(result.getString("adres_tel"));
            tedarikci.setWebSite(result.getString("websitesi"));
            tedarikci.setIlgiliKisi(result.getString("ilgili_kisi"));
            tedarikci.setKullaniciAdi(result.getString("kullanici_adi"));
            tedarikci.setEposta(result.getString("eposta"));
            TedarikciListesi.add(tedarikci);
        }
        return TedarikciListesi;
     }catch(SQLException e)
    {
        return TedarikciListesi;
    }


    }

    public boolean silTedarikciFromIhaleTedarkciListesi(int ihale_id, int tedarikci_id) {
        
         String query = "Delete from ted_ih where (ted_id=?)and (ih_id=?)";
    try {
           PreparedStatement stmet =  connection.prepareStatement(query);
           stmet.setInt(1,tedarikci_id);
           stmet.setInt(2,ihale_id);
           
           stmet.executeUpdate();
            return true;
        }
        catch(SQLException e)
        {
            return false;
        }
     }
    
    

  public boolean ekleTedarikciToIhaleTedarkciListesine( int ihale_id, int tedarikci_id)
    {
    String query = "INSERT INTO ted_ih (ih_id, ted_id ) VALUES (?,?)";
   try {
    PreparedStatement statement = connection.prepareStatement(query);
    
    statement.setInt(1, ihale_id);
    statement.setInt(2, tedarikci_id);
    statement.executeUpdate();
    }catch(SQLException e)
    {
        return false;
    }
    return true;
    }

  
   public List<Ihale> listeleIhale() {
        List<Ihale> ihaleler = new LinkedList<Ihale>();
        try {
            String query = "Select * from ihale";
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            Ihale ihale;
            java.util.Date baslamaTarihi;
            java.util.Date bitisTarihi;
            String baslangicSaati;
            String bitisSaati;
            SatinAlmaci satinAlmaci = new SatinAlmaci();
            String donmadurumu;
            while (rs.next()) {
                Timestamp tba = rs.getTimestamp("baslama_tarihi");
                //baslamaTarihi = new java.util.Date(tba.getYear(),tba.getMonth(),tba.getDate());
                baslamaTarihi = new java.util.Date(tba.getTime());
                Timestamp tbi = rs.getTimestamp("bitis_tarihi");
                // bitisTarihi = new java.util.Date(tbi.getYear(),tbi.getMonth(),tbi.getDate());
                bitisTarihi = new java.util.Date(tbi.getTime());
                String baslangicS = Integer.toString(tba.getHours());
                if(baslangicS.length() < 2)
                    baslangicS="0"+baslangicS;
                
                String baslangicD = Integer.toString(tba.getMinutes());
                if(baslangicD.length() < 2)
                    baslangicD = "0"+baslangicD;
                baslangicSaati = baslangicS + ":" + baslangicD;
                
                String bitisS = Integer.toString(tbi.getHours());
                String bitisD = Integer.toString(tbi.getMinutes());
                if(bitisS.length()<2)
                    bitisS = "0" +bitisS;
                if(bitisD.length()<2)
                    bitisD = "0" +bitisD;
  
                bitisSaati = bitisS + ":" + bitisD;
                satinAlmaci.setId(rs.getInt("sat_almaci_id"));
                satinAlmaci = getirSatinAlmaci(satinAlmaci);
                if(rs.getBoolean("donmadurumu"))
                donmadurumu="Donduruldu";
                else 
                donmadurumu="Aktif";
                             
   ihale = new Ihale(rs.getInt("idihale"), rs.getString("aciklama"), baslamaTarihi, bitisTarihi, satinAlmaci, rs.getString("ihale_adi"), baslangicSaati, bitisSaati,rs.getString("belge"), donmadurumu);
                ihaleler.add(ihale);
            }


        } catch (SQLException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ihaleler;

    }
   
   
   
   //aynısı alındı değiştirme yapılmadı
    public SatinAlmaci getirSatinAlmaci(SatinAlmaci satinAlmaci) {
        SatinAlmaci satinAlmaci2 = new SatinAlmaci();
        try {

            String query = "Select * from satinalmaci where idsatinalmaci = ?";
            PreparedStatement stmt = connection.prepareStatement(query);
            stmt.setInt(1, satinAlmaci.getId());
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                satinAlmaci2 = new SatinAlmaci(rs.getInt("idsatinalmaci"), rs.getString("sirket_adi"), rs.getString("adres_tel"), rs.getString("websitesi"), rs.getString("ilgili_kisi"), rs.getString("sifre"), rs.getString("kullanici_adi"), rs.getString("eposta"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        }
        return satinAlmaci2;
    }





 public void guncelleIhaleDurumu(Ihale ihale) {
           try {
            String query = "UPDATE ihale SET donmadurumu =? where idihale =?";
            PreparedStatement stmt = connection.prepareStatement(query);
            boolean donmadurumu=false;
            
            if("Aktif".equals(ihale.getDonmaDurumu()))
               donmadurumu=true;
            else 
                donmadurumu=false;
                
            stmt.setBoolean(1,donmadurumu);
            stmt.setInt(2, ihale.getId());
            stmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

public int tedarikci_ihalede_varmi(int ted_id, int ih_id) {
       
        try {
            String query1 = "SELECT count(*) toplam_sayi FROM ted_ih where ted_id=? AND ih_id=?";
            PreparedStatement ps1 =  connection.prepareStatement(query1);
            ps1.setInt(1, ted_id);
            ps1.setInt(2, ih_id);
            int as=0;
            ResultSet rs1 = ps1.executeQuery();
            if(rs1.next())
             as = rs1.getInt("toplam_sayi");
        return as;
         } catch (SQLException ex) {
            Logger.getLogger(DatabaseYakup.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
     
    }

/*public int tedarikci_min_teklif(int teklif_no, int ted_id) {
       
        try {
            String query1 = "select sum(teklif*miktari) ihale_toplam_fiyati from teklif, kalemler where teklif.kalem_id=kalemler.idkalemler and ihale_no=kalemler.ihale_no and tedarikci_id=? and teklif_no=? group by ihale_no, tedarikci_id ,teklif_no";
            PreparedStatement ps1 =  connection.prepareStatement(query1);
            ps1.setInt(1, ted_id);
            ps1.setInt(2, teklif_no);
            
            int as=0;
            ResultSet rs1 = ps1.executeQuery();
            if(rs1.next())
             as = rs1.getInt("ihale_toplam_fiyati");
        return as;
         } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
     
    }


/*
public int bul_IhaleNo_TeklifNodan(int teklif_no) {
       
        try {
            String query1 = "SELECT ihale_no FROM teklif, kalemler where teklif.kalem_id=kalemler.idkalemler and teklif_no=? group by teklif_no";
            PreparedStatement ps1 =  connection.prepareStatement(query1);
            
            ps1.setInt(1, teklif_no);
            
            int as=0;
            ResultSet rs1 = ps1.executeQuery();
            if(rs1.next())
             as = rs1.getInt("ihale_no");
        return as;
         } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
     
    }


/*public int tedarikci_eski_max_teklif(int ted_id, int ihale_no) {
       
        try {
            String query1 = "select max(teklifler_kalemsayisi.sayisi) kalem_say from (select  teklif_no, count(teklif) sayisi from teklif where tedarikci_id=?  group by teklif_no)teklifler_kalemsayisi where sayisi=(SELECT count(*) FROM kalemler where ihale_no=?)";
            PreparedStatement ps1 =  connection.prepareStatement(query1);
            ps1.setInt(1, ted_id);
            ps1.setInt(2, ihale_no);
            
            int as=0;
            ResultSet rs1 = ps1.executeQuery();
            if(rs1.next())
             as = rs1.getInt("kalem_say");
        return as;
         } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
            return -1;
        }
     
    }    
    
  */  

 public List  getirIhaledeki_Tedarikcilerin_Id_Listesi(int kalem_id){
List ihaledeki_ted_id_listesi = new LinkedList();  
         try {
            String query ="select ted_id from ted_ih where ih_id=(select ihale_no from teklif, kalemler where teklif.kalem_id=kalemler.idkalemler and teklif.kalem_id=? group by ihale_no)";
            PreparedStatement ps = connection.prepareStatement(query);
            ps.setInt(1, kalem_id);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                ihaledeki_ted_id_listesi.add(rs.getInt("ted_id")); 
            
            }
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
            ihaledeki_ted_id_listesi.add(-1); 
        }
        return  ihaledeki_ted_id_listesi;
    }





 public int getir_Max_Tam_Teklif_No(int tedId) {
        int teklif_no=-1;
        try {
                String query1 = "select  max(teklif_no) max_teklif_no from teklif where tedarikci_id=? group by tedarikci_id";
            PreparedStatement ps1 =  connection.prepareStatement(query1);
            ps1.setInt(1, tedId);
            ResultSet rs1 = ps1.executeQuery();
            if(!rs1.next())
                teklif_no=0;
            else
                teklif_no=rs1.getInt("max_teklif_no");
            
           
        
         } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
        }
        return teklif_no;  
    }
  
 public List getKategoriler(int ihale_id)
 {
     List kategoriler= new LinkedList();
        try {
            String query = "select distinct(kategori_adi) kategoriadi from kategori,kalem_tanimlama,kategori_kalem, kalemler where kategori_kalem.kategori_id = kategori.idkategori and  kategori_kalem.kalem_id = kalem_tanimlama.idkalem_tanimlama and kalemler.kalem_id=kategori_kalem.kalem_id and kalemler.ihale_no=?";
                    PreparedStatement stmt = connection.prepareStatement(query);
                    stmt.setInt(1, ihale_id);
                    ResultSet rs = stmt.executeQuery();
                    while(rs.next()){
                        kategoriler.add(rs.getString("kategoriadi"));
                           }
                     
                     
                    
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
        }
           return kategoriler;
    }


public int get_kategori_bazinda_min_teklif(int ted_id, int ihale_id, String kategori)
{

//String query="select  sum(miktari*teklif) toplam from kategori, kategori_kalem,teklif, kalemler where kategori_adi=? and ihale_no=? and tedarikci_id=? and kategori_kalem.kategori_id=idkategori and teklif.kalem_id=kategori_kalem.kalem_id and teklif.kalem_id=kalemler.idkalemler group by teklif_no desc";
String query="select min(asd.toplam) toplam from(   select  sum(teklif.teklif*kalemler.miktari) toplam from kalemler ,kategori_kalem ,kategori, teklif where ihale_no =?  and  kalemler.kalem_id=kategori_kalem.kalem_id  and kategori.idkategori=kategori_kalem.kategori_id    and  kategori_adi like ?  and teklif.kalem_id=kalemler.idkalemler  and teklif.tedarikci_id=? group by teklif.teklif_no) asd";
int ret=0;
try{
 


  PreparedStatement stmt = connection.prepareStatement(query);
                    stmt.setInt(1, ihale_id);
                    stmt.setString(2, kategori);
                    stmt.setInt(3, ted_id);
                    ResultSet rs = stmt.executeQuery();
                    if(rs.next()){
                        ret=rs.getInt("toplam");
                           }
                     
                     
                    
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
        }
           return ret;
    
}

   
    public List<Tedarikci> listeTedarikci(int sat_id) throws SQLException {
        String query = "SELECT * FROM  tedarikci, sat_ted where tedarikci.idtedarikci=sat_ted.ted_id and sat_ted.sa_id=?";
        List<Tedarikci> TedarikciListesi = new ArrayList<Tedarikci>();

        try {
            PreparedStatement commit = this.connection.prepareStatement(query);
            commit.setInt(1, sat_id);
            ResultSet result = commit.executeQuery();
             while (result.next()) {
                Tedarikci tedarikci = new Tedarikci();
                tedarikci.setId(result.getInt("idtedarikci"));
                tedarikci.setSirketAdi(result.getString("sirket_adi"));
                tedarikci.setAdres(result.getString("adres_tel"));
                tedarikci.setWebSite(result.getString("websitesi"));
                tedarikci.setIlgiliKisi(result.getString("ilgili_kisi"));
                tedarikci.setKullaniciAdi(result.getString("kullanici_adi"));
                tedarikci.setEposta(result.getString("eposta"));
                TedarikciListesi.add(tedarikci);
            }
            return TedarikciListesi;
        } catch (SQLException e) {
            return TedarikciListesi;
        }


    }

    public int tedarikci_min_teklif(int ted_id, Ihale ihale) { 
  
        int teklif = 0;
        try {
            String query = 
                    "select toplam_min min ,tedarikci_id,tedarikci.* from (select sum(a.min_teklif) as toplam_min,a.tedarikci_id  from    ( select min(teklif*miktari) as min_teklif,tedarikci_id from mydb.teklif tek, mydb.kalem_tanimlama kal,mydb.kalemler kal_bil,mydb.tedarikci ted where tek.kalem_id = kal_bil.idkalemler  and kal_bil.kalem_id = kal.idkalem_tanimlama and ted.idtedarikci = tek.tedarikci_id and kal_bil.ihale_no = ? group by tedarikci_id,tek.kalem_id ) a group by tedarikci_id) b, mydb.tedarikci where tedarikci.idtedarikci = b.tedarikci_id and tedarikci.idtedarikci=?";
        
            PreparedStatement ps = connection.prepareStatement(query);
            ps.setInt(1, ihale.getId());
            ps.setInt(2, ted_id);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                teklif = rs.getInt("min");
            
            }
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return teklif;
 
    
    }

    public int getMinTeklifUcreti(int max_no, int ted_id, int kalem_id) {
      int teklif=0;
        try {
            String query = "select * from teklif where teklif_no=? and tedarikci_id=? and kalem_id=?";
        
            PreparedStatement ps = connection.prepareStatement(query);
            ps.setInt(1, max_no);
            ps.setInt(2, ted_id);
            ps.setInt(3, kalem_id);
          
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                teklif=rs.getInt("teklif");
                          }
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseMehmet.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return teklif;
 
    }
        }
